import ast

# 示例代码
code = """
#初始化最高温度
maxTemp=33
#初始化温度计
thermometer=Device(device_id=0)
#获取温度
temperature=thermometer.Temperature
#初始化空调
air_cond=Device(device_id=1)
#设置空调开关
air_cond.On=0
a=a+b
if temperature>25:
    air_cond.On=1
else:
    air_cond.On=0
for i in range(3):
    print(i)
while a < 10:
    a += 1
"""
AssCode=[]#汇编代码
# 用于存储已使用的寄存器
used_registers = {
    "d0": 0,
    "d1": 0,
    "d2": 0,
    "d3": 0,
    "d4": 0,
    "d5": 0,

    "r0": 0,
    "r1": 0,
    "r2": 0,
    "r3": 0,
    "r4": 0,
}

def get_available_register(type):
    '''
    分配寄存器
    :param type: 请求的寄存器的类型
    :return:
    '''
    if type == "d":
        for i in range(0, 5):  # 从 d1 开始尝试分配
            reg = f"d{i}"
            if not used_registers[reg]:
                used_registers[reg]=1
                return reg
    elif type == "r":
        for i in range(1, 16):  # 从 r1 开始尝试分配
            reg = f"r{i}"
            if not used_registers[reg]:
                used_registers[reg]=1
                return reg
    raise Exception("寄存器资源已耗尽")


# 解析代码为抽象语法树
tree = ast.parse(code)

# 定义一个访问器类
class MyVisitor(ast.NodeVisitor):
    def visit_Assign(self, node):  # 访问赋值节点
        print("访问赋值节点:", ast.unparse(node))

        # 获取左边节点（目标）
        targets = [ast.unparse(target) for target in node.targets]
        print("  赋值节点左节点 (目标):", targets)

        # 获取右边节点（值）
        value = ast.unparse(node.value)
        print("  赋值节点右节点 (值):", value)

        # 获取右边节点的类型
        if isinstance(node.value, ast.Constant):
            right_type = 'Constant'
        elif isinstance(node.value, ast.Name):
            right_type = 'Variable'
        elif isinstance(node.value, ast.BinOp):
            right_type = 'Binary Operation'
        elif isinstance(node.value, ast.Call):
            right_type = 'Function Call'
        else:
            right_type = 'Unknown'

        print("  右边节点类型:", right_type)

        print("======================")




        self.generic_visit(node)

    def visit_BinOp(self, node):  # 访问二元运算节点（数学运算）
        print("访问二元运算节点（数学运算）:", ast.unparse(node))
        # 获取左边节点
        left = ast.unparse(node.left)
        print("  二元运算节点左边节点:", left)

        # 获取右边节点
        right = ast.unparse(node.right)
        print("  二元运算节点右边节点:", right)

        # 获取运算符号
        if isinstance(node.op, ast.Add):
            operator = '+'
        elif isinstance(node.op, ast.Sub):
            operator = '-'
        elif isinstance(node.op, ast.Mult):
            operator = '*'
        elif isinstance(node.op, ast.Div):
            operator = '/'
        else:
            operator = 'Unknown'

        print("  二元运算节点操作:", operator)
        print("======================")
        self.generic_visit(node)

    def visit_Call(self, node):  # 访问函数调用节点（对象创建）
        print("访问函数调用节点（对象创建）:", ast.unparse(node))
        print("======================")
        self.generic_visit(node)

    def visit_Attribute(self, node):  # 访问属性调用节点（对象属性调用）
        print("访问属性调用节点（对象属性调用）:", ast.unparse(node))
        print("======================")
        self.generic_visit(node)
    def visit_If(self, node):  # 访问判断语句节点
        print("访问判断语句节点:", ast.unparse(node))
        print("  条件:", ast.unparse(node.test))
        print("  主体:")
        for stmt in node.body:
            print("    ", ast.unparse(stmt))
        if node.orelse:
            print("  Else:")
            for stmt in node.orelse:
                print("    ", ast.unparse(stmt))
        print("======================")
        self.generic_visit(node)

    def visit_For(self, node):  # 访问 for 循环节点
        print("访问 for 循环节点:", ast.unparse(node))
        print("  标志:", ast.unparse(node.target))
        print("  范围:", ast.unparse(node.iter))
        print("  主体:")
        for stmt in node.body:
            print("    ", ast.unparse(stmt))
        print("======================")
        self.generic_visit(node)

    def visit_While(self, node):  # 访问 while 循环节点
        print("访问 while 循环节点:", ast.unparse(node))
        print("  条件:", ast.unparse(node.test))
        print("  主体:")
        for stmt in node.body:
            print("    ", ast.unparse(stmt))
        print("======================")
        self.generic_visit(node)

# 使用访问器类访问语法树
visitor = MyVisitor()
visitor.visit(tree)

